﻿using System;
using System.Collections.Generic;

using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WLMCoreLibrary;
using SAW_Core;
using System.Data;
using System.Data.Odbc;
using System.Text;
using System.Configuration;

namespace SAW
{
    public partial class ModuloProveedores : System.Web.UI.Page
    {
        dbConnector ConexionDB;
        protected override void OnUnload(EventArgs e)
        {
            //ConexionDB.CloseConnection(); 
            base.OnUnload(e);
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            ConexionDB = new dbConnector();
            FuncionesLocales.CheckPagePermision(ref ConexionDB);
            if (Request.QueryString["listado"] == "true")
                ListadoJSON();

            FuncionesLocales.ManejarMensaje();
            if (Request.QueryString["reporteCxP"] != null)
            {
                PanelGridCxP.Visible = true;
                PanelGridProveedors.Visible = false;
            }

            if (Request.QueryString["Add"] == "true")
            {
                PanelGridProveedors.Visible = false;
                PanelDatosProveedors.Visible = true;
                PreloadInfo();
                if (idRegistroProveedor.Text == "0")
                    PanelProveedorSaldoInicial.Visible = true;
                botonGuardarProveedor.Enabled = true;
            }
            else
                if (Request.QueryString["idProveedor"] != null && !IsPostBack)
                    if (Request.QueryString["editar"] != null)
                    {
                        if (Request.QueryString["json"] == null)
                            CargarRegistro(Convert.ToInt32(Request.QueryString["idProveedor"]));
                        else
                        {
                            Proveedor Proveedor = new Proveedor(Convert.ToInt32(Request.QueryString["idProveedor"]),ref ConexionDB);
                            Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(Proveedor));
                            ConexionDB.CloseConnection();
                            Response.End();
                        }
                    }
                    else
                    {
                        if(Request.QueryString["eliminar"] != null)
                                BorrarProveedor(Convert.ToInt32(Request.QueryString["idProveedor"]));
                        if (Request.QueryString["detalle"] != null)
                        {
                            
                            DetalleProveedor(Convert.ToInt32(Request.QueryString["idProveedor"]));
                        }
                    }




        }

        protected void DetalleProveedor(int idProveedor)
        {
            PanelGridProveedors.Visible = false;
            PanelDetalleProveedor.Visible = true;
            Proveedor proveedor = new Proveedor(idProveedor,ref ConexionDB);
            proveedor.NombreCategoria = new ClienteCategoria(proveedor.idCategoria,ref ConexionDB).NombreCategoria;
            proveedor.NombreVendedor = new Vendedor(proveedor.idVendedor,ref ConexionDB).NombreCompleto;
            proveedor.NombreCondicionesPago = new Condicionespago(proveedor.idCondicionesPago,ref ConexionDB).NombreCondicion;
            CompraCollection cotizaciones = new CompraCollection(proveedor,ref ConexionDB);
            if (cotizaciones.UltimaCotizacion() != null)
            {
                proveedor.UltimaCotizacion = cotizaciones.UltimaCotizacion().Total;
                proveedor.FechaUltimaCotizacion = cotizaciones.UltimaCotizacion().fechaCreacion;
            }
            if (cotizaciones.UltimoPedido() != null)
            {
                proveedor.UltimaCompra = cotizaciones.UltimoPedido().Total;
                proveedor.FechaUltimaCompra = cotizaciones.UltimoPedido().fechaCreacion;
            }

            idRegistroProveedor.Text = proveedor.id.ToString();
            proveedor.GenerarArchivoXML();

            string rutaArchivos = ConfigurationManager.AppSettings["XMLProveedoresFolder"] + idProveedor.ToString("00000") + "/";
            LabelDetalleProveedor.Text = WLMFunctions.TransformXML(ConfigurationManager.AppSettings["siteURL"] + rutaArchivos + idProveedor.ToString("00000") + ".xml", ConfigurationManager.AppSettings["siteURL"] + ConfigurationManager.AppSettings["XMLStyleFolder"] + "proveedorPantalla.xsl");
            Response.Write("<script>"+
                "var idProveedorDetalle=" + idProveedor + ";"+
                "$('#botonEditarProveedor').attr('disabled',false);"+
                "$('#botonBorrarProveedor').attr('disabled',false);" +
                "</script>");
        }

        protected void botonGuardarProveedor_Click(object sender, EventArgs e)
        {
            GuardarProveedor();
        }

        protected void GuardarProveedor()
        {
            Proveedor proveedor;
            if (idRegistroProveedor.Text == "0")
            {
                proveedor = new Proveedor(ref ConexionDB);
                //
            }
            else
                proveedor = new Proveedor(Convert.ToInt32(idRegistroProveedor.Text),ref ConexionDB);
            //Temporalmente el saldo actual del Proveedor se podra editar
            proveedor.SaldoActual = WLMFunctions.MonedaADecimal(SaldoInicialProveedor.Text);
            proveedor.RazonSocial = RazonSocialProveedor.Text;
            proveedor.NombreComercial = NombreComercialProveedor.Text;
            //proveedor.CuentaBanco = cuentaBancaria.Text;
            proveedor.RFC = RFCProveedor.Text.ToUpper();
            proveedor.Email = EmailUsuarioProveedor.Text + "@" + EmailDominioProveedor.Text;
            GuardarDominio(EmailDominioProveedor.Text);
            proveedor.DireccionFacturacion.Calle = F_CalleProveedor.Text;
            proveedor.DireccionFacturacion.NumeroExterior = F_NumeroExteriorProveedor.Text;
            proveedor.DireccionFacturacion.NumeroInterior = F_NumeroInteriorProveedor.Text;
            proveedor.DireccionFacturacion.Colonia = F_ColoniaProveedor.Text;
            proveedor.DireccionFacturacion.Municipio = F_MunicipioProveedor.Text;
            proveedor.DireccionFacturacion.Ciudad = F_CiudadProveedor.Text;
            proveedor.DireccionFacturacion.Estado = F_EstadoProveedor.Text;
            proveedor.DireccionFacturacion.CP = F_CPProveedor.Text;
            //proveedor.DireccionEnvio.Calle = clabebancaria.Text;
            proveedor.DireccionEnvio.NumeroExterior = NumeroExteriorProveedor.Text;
            proveedor.DireccionEnvio.NumeroInterior = NumeroInteriorProveedor.Text;
            proveedor.DireccionEnvio.Colonia = ColoniaProveedor.Text;
            proveedor.DireccionEnvio.Ciudad = CiudadProveedor.Text;
            proveedor.DireccionEnvio.Municipio = MunicipioProveedor.Text;
            proveedor.DireccionEnvio.Estado = EstadoProveedor.Text;
            proveedor.DireccionEnvio.CP = CPProveedor.Text;
            proveedor.Telefono = TelefonoProveedor.Text;
            proveedor.Telefono2 = Telefono2Proveedor.Text;
            proveedor.Telefono3 = Telefono3Proveedor.Text;
            proveedor.FAX = FAXProveedor.Text;
            //proveedor.Banco = banco.Text;
            proveedor.LimiteCredito = WLMFunctions.MonedaADecimal(LimiteCreditoProveedor.Text);
            proveedor.WebSite = WebSiteProveedor.Text;
            proveedor.Observaciones = ObservacionesProveedor.Text;
            proveedor.idListaPrecios = Convert.ToInt32(idListaPrecios.SelectedValue);
            proveedor.idCondicionesPago=Convert.ToInt32( idCondicionesPago.SelectedValue);
            proveedor.idVendedor = Convert.ToInt32(idVendedor.SelectedValue);
            ClienteCategoria categoria = new ClienteCategoria(Convert.ToInt32(idCategoriaProveedor.Text.ToLower()),ref ConexionDB);
            if ( categoria.id == 0)//categoria.NombreCategoria.ToLower() != CategoriaProveedor.Text.ToLower() ||
            {
                categoria = new ClienteCategoria(ref ConexionDB);
                categoria.NombreCategoria = CategoriaProveedor.Text.ToLower();
                categoria.Save();
                proveedor.idCategoria = categoria.id;
            }
            else
                proveedor.idCategoria = categoria.id;

            proveedor.Save();
            for (int x = 1; x <= Convert.ToInt32(Request.Form["cantidadContactosProveedor"]); x++)
            {
                GuardarContactoProveedor(proveedor, x);
            }

            for (int x = 1; x <= Convert.ToInt32(Request.Form["cantidadCuentasProveedor"]); x++)
            {
                GuardarCuentaProveedor(proveedor, x);
            }
            //Response.Write("El Proveedor ha sido guardado Correctamente");
            //Response.End();
            ConexionDB.CloseConnection();
            Response.Redirect("/ModuloProveedores.aspx");

        }

        protected void GuardarDominio(string NombreDominio)
        {
            DominioEmail dominio = new DominioEmail(NombreDominio,ref ConexionDB);
            if (dominio.id == 0)
            {
                dominio = new DominioEmail(ref ConexionDB);
                dominio.Dominio = NombreDominio;
                dominio.Save();
            }
        }

        protected void GuardarContactoProveedor(Proveedor Proveedor, int idRequest)
        {
            if (Request["nombreContactoProveedor" + idRequest] != "" && Request["nombreContactoProveedor" + idRequest] != null)
            {
                Contacto contacto;
                if (Request["ConctactoIdProveedor" + idRequest] == "0")
                    contacto = new Contacto(ref ConexionDB);
                else
                    contacto = new Contacto(Convert.ToInt32(Request["ConctactoIdProveedor" + idRequest]),ref ConexionDB);

                contacto.idProveedor = Proveedor.id;
                if (Request["ConctactoEliminadoProveedor" + idRequest] == "true")
                    contacto.idProveedor = 0;
                contacto.Nombre = Request["nombreContactoProveedor" + idRequest];
                contacto.Apellidos = Request["apellidosContactoProveedor" + idRequest];
                contacto.Puesto = Request["puestoContactoProveedor" + idRequest];
                contacto.Telefono = Request["telefonoContactoProveedor" + idRequest];
                contacto.Celular = Request["celularContactoProveedor" + idRequest];
                contacto.Email = Request["emailUsuarioContactoProveedor" + idRequest] + "@" + Request["emailDominioContactoProveedor" + idRequest];
                GuardarDominio(Request["emailDominioContactoProveedor" + idRequest].ToString());
                contacto.Calle = Proveedor.DireccionEnvio.Calle;
                contacto.NumeroExterior = Proveedor.DireccionEnvio.NumeroExterior;
                contacto.NumeroInterior = Proveedor.DireccionEnvio.NumeroInterior;
                contacto.Colonia = Proveedor.DireccionEnvio.Colonia;
                contacto.Ciudad = Proveedor.DireccionEnvio.Ciudad;
                contacto.Municipio = Proveedor.DireccionEnvio.Municipio;
                contacto.Estado = Proveedor.DireccionEnvio.Estado;
                contacto.Save();

            }
        }

        protected void GuardarCuentaProveedor(Proveedor Proveedor, int idRequest)
        {
            if (Request["BancoCuentaProveedor" + idRequest] != "" && Request["NumeroCuentaProveedor" + idRequest] != null)
            {
                ProveedorCuentaBancaria cuentaB;
                if (Request["CuentaIdProveedor" + idRequest] == "0")
                    cuentaB = new ProveedorCuentaBancaria(ref ConexionDB);
                else
                    cuentaB = new ProveedorCuentaBancaria(Convert.ToInt32(Request["CuentaIdProveedor" + idRequest]),ref ConexionDB);

                cuentaB.idProveedor = Proveedor.id;
                if (Request["CuentaEliminadoProveedor" + idRequest] == "true")
                    cuentaB.idProveedor = 0;
                cuentaB.cuenta = Request["NumeroCuentaProveedor" + idRequest];
                cuentaB.institucion = Request["BancoCuentaProveedor" + idRequest];
                cuentaB.CLABE = Request["CLABECuentaProveedor" + idRequest];
                cuentaB.Save();

            }
        }

        protected void CargarRegistro(int idRegistro)
        {
            PreloadInfo();
            PanelGridProveedors.Visible = false;
            PanelDatosProveedors.Visible = true;
            Proveedor proveedor = new Proveedor(idRegistro,ref ConexionDB);


            //Saldo Actual temporalmente se podra editar
            SaldoInicialProveedor.Text = proveedor.SaldoActual.ToString("C");

            idRegistroProveedor.Text = proveedor.id.ToString();
            RazonSocialProveedor.Text = proveedor.RazonSocial;
            NombreComercialProveedor.Text = proveedor.NombreComercial;
           // cuentaBancaria.Text = proveedor.CuentaBanco;
            RFCProveedor.Text = proveedor.RFC;
            if (proveedor.Email.Contains("@"))
            {
                EmailUsuarioProveedor.Text = proveedor.Email.Split('@')[0];
                EmailDominioProveedor.Text = proveedor.Email.Split('@')[1];
            }
            F_CalleProveedor.Text = proveedor.DireccionFacturacion.Calle;
            F_NumeroExteriorProveedor.Text = proveedor.DireccionFacturacion.NumeroExterior;
            F_NumeroInteriorProveedor.Text = proveedor.DireccionFacturacion.NumeroInterior;
            F_ColoniaProveedor.Text = proveedor.DireccionFacturacion.Colonia;
            F_MunicipioProveedor.Text = proveedor.DireccionFacturacion.Municipio;
            F_CiudadProveedor.Text = proveedor.DireccionFacturacion.Ciudad;
            F_EstadoProveedor.Text = proveedor.DireccionFacturacion.Estado;
            F_CPProveedor.Text = proveedor.DireccionFacturacion.CP;
            //clabebancaria.Text = proveedor.DireccionEnvio.Calle;
            NumeroExteriorProveedor.Text = proveedor.DireccionEnvio.NumeroExterior;
            NumeroInteriorProveedor.Text = proveedor.DireccionEnvio.NumeroInterior;
            ColoniaProveedor.Text = proveedor.DireccionEnvio.Colonia;
            CiudadProveedor.Text = proveedor.DireccionEnvio.Ciudad;
            MunicipioProveedor.Text = proveedor.DireccionEnvio.Municipio;
            EstadoProveedor.Text = proveedor.DireccionEnvio.Estado;
            CPProveedor.Text = proveedor.DireccionEnvio.CP;
            TelefonoProveedor.Text = proveedor.Telefono;
            Telefono2Proveedor.Text = proveedor.Telefono2;
            Telefono3Proveedor.Text = proveedor.Telefono3;
            FAXProveedor.Text = proveedor.FAX;
            //banco.Text = proveedor.Banco;
            LimiteCreditoProveedor.Text = proveedor.LimiteCredito.ToString("C");
            WebSiteProveedor.Text = proveedor.WebSite;
            ObservacionesProveedor.Text = proveedor.Observaciones;

            idCategoriaProveedor.Text = proveedor.idCategoria.ToString();
            CategoriaProveedor.Text = new ClienteCategoria(proveedor.idCategoria,ref ConexionDB).NombreCategoria;
            if (idVendedor.Items.FindByValue(proveedor.idVendedor.ToString()) != null)
                idVendedor.SelectedValue = proveedor.idVendedor.ToString();
            if (idCondicionesPago.Items.FindByValue(proveedor.idCondicionesPago.ToString()) != null)
                idCondicionesPago.SelectedValue = proveedor.idCondicionesPago.ToString();
            idListaPrecios.SelectedValue = proveedor.idListaPrecios.ToString();
            botonGuardarProveedor.Text = "Editar Proveedor";
            botonGuardarProveedor.Enabled = true;
            ContactoCollection constactos = new ContactoCollection(proveedor,ref ConexionDB);
            StringBuilder cadenaContactos = new StringBuilder();
            cadenaContactos.Append("<script>$(document).ready(function () {");
            foreach (Contacto cont in constactos.Elementos)
            {

                cadenaContactos.Append("cargarContactoProveedor('" + cont.id + "', '" + cont.Nombre + "', '" + cont.Apellidos + "', '" + cont.Puesto + "', '" + cont.Telefono + "', '" + cont.Celular + "','" + cont.Email + "');");
            }

            ProveedorCuentaBancariaCollection cuentas = new ProveedorCuentaBancariaCollection(proveedor,ref ConexionDB);
            foreach (ProveedorCuentaBancaria cuen in cuentas.Elementos)
            {

                cadenaContactos.Append("cargarCuentaProveedor('" + cuen.id + "', '" + cuen.institucion + "', '" + cuen.cuenta + "', '" + cuen.CLABE + "');");
            }

            cadenaContactos.Append("});");

            cadenaContactos.Append("</script>");
            contactosActuales.Text = cadenaContactos.ToString();
        }

        protected void ListadoJSON()
        {

            string FieldList = "SELECT C.id,RazonSocial,NombreComercial,Cat.NombreCategoria,CONCAT('$ ',CAST(Format(SaldoActual,2) AS CHAR)) as SaldoActuala,CONCAT('$ ',CAST(Format(LimiteCredito,2) AS CHAR)) as LimiteCreditoa,CONCAT(\"<img src='/iconos/vcard.png' title='Detalle del Proveedor No. \",CAST(C.id AS CHAR) ,\" [\",RazonSocial ,\"]' border=0  onclick=CargarPaginaProveedor(\'/ModuloProveedores.aspx?idProveedor=\",CAST(C.id AS CHAR),\"&detalle=true')  class='edicionGrid' />\" ) as editar,CONCAT(\"<img src='/iconos/user_edit.png' class='edicionGrid' title='Editar al Proveedor No. \",CAST(C.id AS CHAR) ,\" [\",RazonSocial ,\"]' onclick=CargarPaginaProveedor(\'/ModuloProveedores.aspx?idProveedor=\",CAST(C.id AS CHAR) ,\"&editar=true\'); >\" ) as detalle FROM ProveedoreS C LEFT JOIN clientesCATEGORIAS Cat ON Cat.id=C.idCategoria ";
            int dataPage = Convert.ToInt32(Request["page"]);
            int rowsPerPage = Convert.ToInt32(Request["rp"]);
            string sortname = Request["sortname"];
            string sortorder = Request["sortorder"];
            if (sortname == null) sortname = "id";
            if (sortorder == null) sortorder = "desc";
            string sort = "ORDER BY " + sortname + " " + sortorder;
            if (dataPage == 0) dataPage = 1;
            if (rowsPerPage == 0) rowsPerPage = 50;
            int start = ((dataPage - 1) * rowsPerPage);
            string where = "";
            string qtype = Request["qtype"];
            if (Request["query"] != null) where = " WHERE C.activo=1 AND " + qtype + " LIKE '%" + Request["query"] + "%' ";
            else where = " WHERE C.activo=1 ";
            string limit = "LIMIT " + start + ", " + rowsPerPage;

            string strCommand = FieldList + where + sort + " " + limit;
            WLMFunctions.JsonGrid(strCommand, FieldList, where, dataPage);

        }

        protected void PreloadInfo()
        {
            CondicionespagoCollection condiciones = new CondicionespagoCollection(ref ConexionDB);
            idCondicionesPago.DataValueField = "id";
            idCondicionesPago.DataTextField = "NombreCondicion";
            idCondicionesPago.DataSource = condiciones.Elementos;
            idCondicionesPago.DataBind();

            VendedorCollection vendedores = new VendedorCollection(ref ConexionDB);
            idVendedor.DataValueField = "id";
            idVendedor.DataTextField = "NombreCompleto";
            idVendedor.DataSource = vendedores.Elementos;
            idVendedor.DataBind();

        }

        protected void BorrarProveedor(Int32 idRegistro)
        {
            Proveedor proveedor = new Proveedor(idRegistro,ref ConexionDB);
            proveedor.Delete();
            string mensaje = "El proveedor " + proveedor.RazonSocial + " fue eliminado correctamente del sistema";
            ConexionDB.CloseConnection();
            Response.Redirect("/moduloProveedores.aspx?mensaje="+mensaje);
            
        }
    }
}